/**
 * 文件级注释：
 * 分账管理前端服务封装，统一遵循前端成功判断：接口返回值 `code === 0` 视为成功。
 * 仅在 H5 项目中进行编写与修改。
 */

import http from '../api/http'
import type { ApiResult, PageResult } from './types'

/**
 * 类级注释：分账协议请求与响应类型
 */
export interface DividedAgreementRequest {
  /** 分账协议ID（更新/删除时使用） */
  Id?: string
  /** 分账协议编号 */
  AgreementCode?: string
  /** 分账协议名称 */
  AgreementName?: string
  /** 父级协议ID（创建子协议时） */
  ParentAgreementId?: string
  /** 生效时间 */
  StartTime?: string
  /** 失效时间（为空为长期有效） */
  EndTime?: string
  /** 启用状态(0=禁用，1=启用) */
  EnableStatus?: number
  /** 激活状态(0=未激活，1=已激活) */
  ActivationStatus?: number
  /** 分账周期 */
  DividedCycle?: number
  /** 所属商户ID */
  MerchantId?: string
  /** 批量操作的ID集合（删除等） */
  Ids?: string[]
}

export interface DividedAgreementResponse {
  id?: string
  agreementCode?: string
  agreementName?: string
  parentAgreementId?: string
  startTime?: string
  endTime?: string
  enableStatus?: number
  activationStatus?: number
  dividedCycle?: number
  merchantId?: string
  creationTime?: string
  creatorId?: string
  lastModificationTime?: string
  lastModifierId?: string
  isDeleted?: boolean
  codeIds?: string[]
  codeNames?: string[]
}

/**
 * 类级注释：批量设置协议下收款码请求类型
 */
export interface SetDividedAgreementPaymentCodesRequest {
  /** 分账协议ID（必填） */
  DividedAgreementId: string
  /** 收款码ID集合（为空表示清空） */
  PaymentCodeIds: string[]
  /** 商户ID（可选） */
  MerchantId?: string
}

/**
 * 类级注释：分账协议详情（参与者）请求/响应类型
 */
export interface DividedAgreementDetailRequest {
  /** 详情ID（编辑/删除时） */
  Id?: string
  /** 分账协议ID */
  DividedAgreementId?: string
  /** 用户ID */
  UserId?: string
  /** 分账比例（0-1） */
  Ratio?: number
  /** 是否主账户 */
  IsMasterAccount?: boolean
  /** 用户团队角色ID */
  UserRoleId?: string
  /** 批量操作ID集合（删除时） */
  Ids?: string[]
}

export interface DividedAgreementDetailResponse {
  id?: string
  dividedAgreementId?: string
  userId?: string
  userName?: string
  userPhone?: string
  ratio?: number
  isMasterAccount?: boolean
  activationStatus?: number
  userRoleId?: string
  creationTime?: string
}

/**
 * 类级注释：分账记录查询与响应类型
 */
export interface DividedRecordQueryRequest {
  /** 商户ID */
  merchantId?: string
  /** 分账协议ID */
  dividedAgreementId?: string
  /** 收款码ID */
  codeId?: string
  /** 分账日期（商户记录接口必填） */
  dividedDate?: string
  /** 查询开始时间 */
  beginTime?: string
  /** 查询结束时间 */
  endTime?: string
  /** 页码 */
  page?: number
  /** 每页条数 */
  limit?: number
}

export interface DividedRecordResponse {
  id?: string
  recordNo?: string
  orderId?: string
  codeId?: string
  dividedAgreementId?: string
  dividedAgreementName?: string
  totalDividedAmount?: number
  merchantId?: string
  storeId?: string
  dividedDate?: string
  creationTime?: string
  userDividedAmount?: number
}

export interface DividedRecordDetailResponse {
  id?: string
  dividedRecordId?: string
  userId?: string
  userName?: string
  ratio?: number
  dividedAmount?: number
  creationTime?: string
  entryTime?: string
  isEntry?: boolean
  isMasterAccount?: boolean
}

/**
 * 函数级注释：获取分账协议列表
 * @param page 页码，默认 1
 * @param limit 每页条数，默认 10
 * @param key 模糊查询（协议名称）
 * @param merchantId 商户ID
 * @param enableStatus 启用状态过滤（-1 不过滤）
 * @param activationStatus 激活状态过滤（-1 不过滤）
 * @returns ApiResult<PageResult<DividedAgreementResponse>> 分页列表
 * @throws 可能抛出网络请求异常
 */
export async function getDividedAgreementList(
  page: number = 1,
  limit: number = 10,
  key: string = '',
  merchantId: string = '',
  enableStatus: number = -1,
  activationStatus: number = -1
): Promise<ApiResult<PageResult<DividedAgreementResponse>>> {
  const resp = await http.get<ApiResult<PageResult<DividedAgreementResponse>>>(
    '/Divided/GetDividedAgreementList',
    { params: { page, limit, key, merchantId, enableStatus, activationStatus } }
  )
  return resp.data
}

/**
 * 函数级注释：获取单个分账协议详情
 * @param id 分账协议ID
 * @returns ApiResult<DividedAgreementResponse> 分账协议详情
 * @throws 可能抛出网络请求异常
 */
export async function getDividedAgreement(id: string): Promise<ApiResult<DividedAgreementResponse>> {
  const resp = await http.get<ApiResult<DividedAgreementResponse>>('/Divided/GetDividedAgreement', { params: { id } })
  return resp.data
}

/**
 * 函数级注释：新增分账协议
 * @param data 请求体：AgreementName、MerchantId、DividedCycle、StartTime、EndTime、ParentAgreementId
 * @returns ApiResult<string> 返回新增协议ID
 * @throws 可能抛出网络请求异常
 */
export async function addDividedAgreement(data: DividedAgreementRequest): Promise<ApiResult<string>> {
  const resp = await http.post<ApiResult<string>>('/Divided/AddDividedAgreement', data)
  return resp.data
}

/**
 * 函数级注释：更新分账协议
 * @param data 请求体：Id、AgreementName、DividedCycle、StartTime、EndTime、EnableStatus
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function updateDividedAgreement(data: DividedAgreementRequest): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/UpdateDividedAgreement', data)
  return resp.data
}

/**
 * 函数级注释：删除分账协议（归档删除）
 * @param data 请求体：包含 Id 或 Ids
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function deleteDividedAgreement(data: DividedAgreementRequest): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/DeleteDividedAgreement', data)
  return resp.data
}

/**
 * 函数级注释：在分账协议里批量设置收款码
 * @param data 请求体：DividedAgreementId、PaymentCodeIds、MerchantId
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function setDividedAgreementPaymentCodes(data: SetDividedAgreementPaymentCodesRequest): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/SetDividedAgreementPaymentCodes', data)
  return resp.data
}

/**
 * 函数级注释：获取分账协议详情（参与者）列表
 * @param dividedAgreementId 分账协议ID
 * @returns ApiResult<DividedAgreementDetailResponse[]> 列表
 * @throws 可能抛出网络请求异常
 */
export async function getDividedAgreementDetailList(dividedAgreementId: string): Promise<ApiResult<DividedAgreementDetailResponse[]>> {
  const resp = await http.get<ApiResult<DividedAgreementDetailResponse[]>>('/Divided/GetDividedAgreementDetailList', { params: { dividedAgreementId } })
  return resp.data
}

/**
 * 函数级注释：新增分账协议详情
 * @param data 请求体：DividedAgreementId、Ratio、UserId、UserRoleId
 * @returns ApiResult<string> 返回新增详情ID
 * @throws 可能抛出网络请求异常
 */
export async function addDividedAgreementDetail(data: DividedAgreementDetailRequest): Promise<ApiResult<string>> {
  const resp = await http.post<ApiResult<string>>('/Divided/AddDividedAgreementDetail', data)
  return resp.data
}

/**
 * 函数级注释：更新分账协议详情
 * @param data 请求体：Id、Ratio、UserId
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function updateDividedAgreementDetail(data: DividedAgreementDetailRequest): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/UpdateDividedAgreementDetail', data)
  return resp.data
}

/**
 * 函数级注释：批量更新分账协议详情
 * @param list 详情列表（每项包含 Id、Ratio、UserId）
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function updateDividedAgreementDetails(list: DividedAgreementDetailRequest[]): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/UpdateDividedAgreementDetails', list)
  return resp.data
}

/**
 * 函数级注释：删除分账协议详情（批量）
 * @param data 请求体：包含 Ids
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function deleteDividedAgreementDetail(data: DividedAgreementDetailRequest): Promise<ApiResult<boolean>> {
  const resp = await http.post<ApiResult<boolean>>('/Divided/DeleteDividedAgreementDetail', data)
  return resp.data
}

/**
 * 函数级注释：确认分账协议详情
 * @param id 分账协议详情ID
 * @param phone 分账人手机号
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function confirmDividedAgreementDetail(id: string, phone: string): Promise<ApiResult<boolean>> {
  const resp = await http.get<ApiResult<boolean>>('/Divided/ConfirmDividedAgreementDetail', { params: { id, phone } })
  return resp.data
}

/**
 * 函数级注释：新增分账记录（手动）
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function addDividedRecord(): Promise<ApiResult<boolean>> {
  const resp = await http.get<ApiResult<boolean>>('/Divided/AddDividedRecord')
  return resp.data
}

/**
 * 函数级注释：分账结算（手动）
 * @param dividedTime 分账结算时间（ISO 字符串）
 * @returns ApiResult<boolean> 是否成功
 * @throws 可能抛出网络请求异常
 */
export async function updateDividedRecord(dividedTime: string): Promise<ApiResult<boolean>> {
  const resp = await http.get<ApiResult<boolean>>('/Divided/UpdateDividedRecord', { params: { dividedTime } })
  return resp.data
}

/**
 * 函数级注释：执行定时任务（结算、分账、分账结算）
 * @param dateTime 目标时间（ISO 字符串）
 * @returns ApiResult<void> 无返回数据，后端会记录日志
 * @throws 可能抛出网络请求异常
 */
export async function executeSettlementTask(dateTime: string): Promise<ApiResult<void>> {
  const resp = await http.get<ApiResult<void>>('/Divided/ExecuteSettlementTask', { params: { dateTime } })
  return resp.data
}

/**
 * 函数级注释：获取分账记录报表
 * @param beginTime 开始时间
 * @param endTime 结束时间
 * @param merchantId 商户ID（可选）
 * @returns ApiResult<{ totalAmount: number; totalCount: number; dividedRecordList: DividedRecordResponse[] }>
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordReport(beginTime: string, endTime: string, merchantId: string = ''): Promise<ApiResult<{ totalAmount: number; totalCount: number; dividedRecordList: DividedRecordResponse[] }>> {
  const resp = await http.get<ApiResult<{ totalAmount: number; totalCount: number; dividedRecordList: DividedRecordResponse[] }>>('/Divided/GetDividedRecordReport', { params: { beginTime, endTime, merchantId } })
  return resp.data
}

/**
 * 函数级注释：获取用户分账记录列表
 * @param beginTime 开始时间
 * @param endTime 结束时间
 * @param page 页码
 * @param limit 每页条数
 * @returns ApiResult<PageResult<DividedRecordResponse>>
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordList(beginTime: string, endTime: string, page: number = 1, limit: number = 10): Promise<ApiResult<PageResult<DividedRecordResponse>>> {
  const resp = await http.get<ApiResult<PageResult<DividedRecordResponse>>>('/Divided/GetDividedRecordList', { params: { beginTime, endTime, page, limit } })
  return resp.data
}

/**
 * 函数级注释：获取商户分账记录列表
 * @param dividedDate 分账日期（年/月/日，ISO 字符串）
 * @param page 页码
 * @param limit 每页条数
 * @param merchantId 商户ID
 * @param dividedAgreementId 分账协议ID
 * @param codeId 收款码ID
 * @returns ApiResult<PageResult<DividedRecordResponse>>
 * @throws 可能抛出网络请求异常
 */
export async function getMerchantDividedRecordList(dividedDate: string, page: number = 1, limit: number = 10, merchantId: string = '', dividedAgreementId: string = '', codeId: string = ''): Promise<ApiResult<PageResult<DividedRecordResponse>>> {
  const resp = await http.get<ApiResult<PageResult<DividedRecordResponse>>>('/Divided/GetMerchantDividedRecordList', { params: { dividedDate, page, limit, merchantId, dividedAgreementId, codeId } })
  return resp.data
}

/**
 * 函数级注释：获取分账记录详情树（当前用户视角）
 * @param dividedRecordId 分账记录ID
 * @returns ApiResult<any> 树状结构（后端已定义）
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordTreeForUser(dividedRecordId: string): Promise<ApiResult<any>> {
  const resp = await http.get<ApiResult<any>>('/Divided/GetDividedRecordTreeForUser', { params: { dividedRecordId } })
  return resp.data
}

/**
 * 函数级注释：获取完整分账树（通过订单ID/记录ID）
 * @param orderId 订单ID
 * @param dividedRecordId 分账记录ID
 * @returns ApiResult<any> 树状结构
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordFullTreeByOrderId(orderId?: string, dividedRecordId?: string): Promise<ApiResult<any>> {
  const resp = await http.get<ApiResult<any>>('/Divided/GetDividedRecordFullTreeByOrderId', { params: { orderId, dividedRecordId } })
  return resp.data
}

/**
 * 函数级注释：获取分账记录根层详情
 * @param dividedRecordId 分账记录ID
 * @returns ApiResult<DividedRecordDetailResponse[]> 根层详情列表
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordRootLayer(dividedRecordId: string): Promise<ApiResult<DividedRecordDetailResponse[]>> {
  const resp = await http.get<ApiResult<DividedRecordDetailResponse[]>>('/Divided/GetDividedRecordRootLayer', { params: { dividedRecordId } })
  return resp.data
}

/**
 * 函数级注释：获取分账记录详情列表
 * @param dividedRecordId 分账记录ID
 * @returns ApiResult<DividedRecordDetailResponse[]> 详情列表
 * @throws 可能抛出网络请求异常
 */
export async function getDividedRecordDetailList(dividedRecordId: string): Promise<ApiResult<DividedRecordDetailResponse[]>> {
  const resp = await http.get<ApiResult<DividedRecordDetailResponse[]>>('/Divided/GetDividedRecordDetailList', { params: { dividedRecordId } })
  return resp.data
}

